/* main.c */
#include "app_inc.h"

/*
* Application Function Declerations.
*/
/* LED. */
void LED_Configuration(void);
void LED_LightOn(uint32_t ledIdx);
void LED_LightOff(uint32_t ledIdx);
/* Button. */
void BTN_Configuration(void);
bool BTN_IsPressedDown(uint32_t btnIdx);

/*
* Application Entry.
*/
int main(void)
{
    uint32_t i;

    BSP_InitStdioUART(115200U);

    printf("\r\n\r\n# GPIO_SimpleButton Example r#\r\n");

    /* Initialize the application. */
    printf("# Initializing ...\r\n");
    
    LED_Configuration();
    BTN_Configuration();
    
    printf("# Ready.\r\n");
    
    /* Print the user guide. */
    printf("# Press the buttons to turn on the LEDs ...\r\n");
    
    while (1)
    {
        for (i = 0U; i < 2U; i++)
        {
            if (BTN_IsPressedDown(i))
            {
                LED_LightOn(i);
            }
            else
            {
                LED_LightOff(i);
            }
        }
    }
}

void LED_Configuration(void)
{
    GPIO_InitPara GPIO_InitStructure;
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12|GPIO_PIN_13;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_Init(GPIOD,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11 | GPIO_PIN_12 |GPIO_PIN_13;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
}

const uint16_t gLedPins[] = {GPIO_PIN_11, GPIO_PIN_12, GPIO_PIN_13}; 

void LED_LightOn(uint32_t ledIdx)
{
    if (ledIdx >= sizeof(gLedPins)/sizeof(gLedPins[0]))
    {
        return;
    }
    GPIO_SetBits(GPIOD, gLedPins[ledIdx]);
}

void LED_LightOff(uint32_t ledIdx)
{
    if (ledIdx >= sizeof(gLedPins)/sizeof(gLedPins[0]))
    {
        return;
    }
    GPIO_ResetBits(GPIOD, gLedPins[ledIdx]);
}

void BTN_Configuration(void)
{
    GPIO_InitPara GPIO_InitStructure;
    
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD ,ENABLE);

    /* Configure PD14\15 pin */
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN_FLOATING;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

const uint16_t gBtnPins[] = {GPIO_PIN_14, GPIO_PIN_15};

bool BTN_IsPressedDown(uint32_t btnIdx)
{
    if (btnIdx >= sizeof(gBtnPins)/sizeof(gBtnPins[0]))
    {
        return false;
    }
    if (RESET == GPIO_ReadInputBit(GPIOD, gBtnPins[btnIdx]))
    {
        return true;
    }
    else
    {
        return false;
    }
}


/* EOF. */
